package com.jboost.common.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baidu.aip.util.Base64Util;
import com.jboost.common.constant.CommonConstant;
import com.jboost.common.file.FileCommonVo;
import com.jboost.common.file.JboostFileVo;
import com.jboost.common.file.constant.VideoBitrateEnum;
import com.jboost.common.util.qiniu.QiniuUtil;
import com.jboost.common.util.oss.OssBootUtil;
import com.jboost.config.FileConfig;
import org.apache.commons.lang.StringUtils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class FileUtils {

    //拼接文件预览URL地址
    public static String getFileUrl(JboostFileVo file) {
        if(null == file||null==file.getFileStore()){
            return null;
        }
        String webHost = FileConfig.WEB_HOST;
        String port = FileConfig.PORT;
        String context = FileConfig.CONTEXT;

        String store = file.getFileStore();
        JSONObject storeJson = JSON.parseObject(store);
        String saveType = storeJson.getString("type");
        String savePath = storeJson.getString("path");
        if (CommonConstant.UPLOAD_TYPE_LOCAL.equals(saveType)) {
            return (port == null || "80".equals(port)?"http://":"https://") + webHost + (port == null || ("80".equals(port)||"443".equals(port)) ? "" : (":" + port)) + context + "/sys/common/static/" + savePath+"?type=review";
        } else if(CommonConstant.UPLOAD_TYPE_OSS.equals(saveType)) {
            return OssBootUtil.getFullUrl(savePath,null);
        } else if(CommonConstant.UPLOAD_TYPE_OBS.equals(saveType)) {
            return store;
        } else if(CommonConstant.UPLOAD_TYPE_KODO.equals(saveType)) {
            if (StringUtils.isNotEmpty(file.getFileExt()) && file.getFileExt().indexOf("video") >-1){
                //视频需要使用 m3u8地址-默认使用720p
                if (null!=file.getBitrateList()){
                    String [] bit = file.getBitrateList().split(CommonConstant.SPLIT_SYMBOL);
                    if (bit.length >0){
                        savePath += "-"+ bit[0] +".m3u8";
                    }else {
                        savePath += "-"+ VideoBitrateEnum.B_720P.code() +".m3u8";
                    }
                }else {
                    savePath += "-"+ VideoBitrateEnum.B_720P.code() +".m3u8";
                }
            }
            return QiniuUtil.getFullUrl(savePath, null);
        }else {
            return savePath;
        }
    }

    private static String getScreenshotUrl(JboostFileVo file) {
        if(null == file||null==file.getFileStore()){
            return null;
        }

        String store = file.getFileStore();
        JSONObject storeJson = JSON.parseObject(store);
        String saveType = storeJson.getString("type");
        String savePath = storeJson.getString("path");
        if(CommonConstant.UPLOAD_TYPE_KODO.equals(saveType)) {
            //视频截图
            savePath += QiniuUtil.SCREENSHOT_SUFFIX;
            return QiniuUtil.getFullUrl(savePath, null);
        }else {
            return null;
        }
    }
    //拼接文件下载URL地址
    public static String getFileDownUrl(JboostFileVo file) {
        String webHost = FileConfig.WEB_HOST;
        String port = FileConfig.PORT;
        String context = FileConfig.CONTEXT;

        String store = file.getFileStore();
        JSONObject storeJson = JSON.parseObject(store);
        String saveType = storeJson.getString("type");
        String savePath = storeJson.getString("path");
        if (CommonConstant.UPLOAD_TYPE_LOCAL.equals(saveType)) {
            return (port == null || "80".equals(port)?"http://":"https://") + webHost + (port == null || ("80".equals(port)||"443".equals(port)) ? "" : (":" + port)) + context + "/sys/common/static/" + savePath+"?type=download";
        } else if(CommonConstant.UPLOAD_TYPE_OSS.equals(saveType)) {
            return OssBootUtil.getDowntUrl(savePath,null);
        }else {
            return savePath;
        }
    }


    /**
     * 通过图片的文件获取图片的base64字符串
     * @param file
     * @return
     */
    public static String file2Base64(JboostFileVo file) {
        return image2Base64( getFileUrl(file) );
    }
    /**
     * 通过图片的url获取图片的base64字符串
     *
     * @param imgUrl 图片url
     * @return 返回图片base64的字符串
     */
    public static String image2Base64(String imgUrl) {
        if(StringUtils.isEmpty(imgUrl)){
            return null;
        }
        URL url = null;
        InputStream is = null;
        ByteArrayOutputStream outStream = null;
        HttpURLConnection httpUrl = null;
        try {
            url = new URL(imgUrl);
            httpUrl = (HttpURLConnection) url.openConnection();
            httpUrl.connect();
            httpUrl.getInputStream();
            is = httpUrl.getInputStream();
            outStream = new ByteArrayOutputStream();
            //创建一个Buffer字符串
            byte[] buffer = new byte[1024];
            //每次读取的字符串长度，如果为-1，代表全部读取完毕
            int len = 0;
            //使用一个输入流从buffer里把数据读取出来
            while ((len = is.read(buffer)) != -1) {
                //用输出流往buffer里写入数据，中间参数代表从哪个位置开始读，len代表读取的长度
                outStream.write(buffer, 0, len);
            }
            // 对字节数组Base64编码
            return Base64Util.encode(outStream.toByteArray());
        } catch (Exception e) {
            e.printStackTrace();

        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outStream != null) {
                try {
                    outStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (httpUrl != null) {
                httpUrl.disconnect();
            }
        }
        return imgUrl;
    }

    public static FileCommonVo getCommonFile(JboostFileVo file) {
        if(null == file || null == file.getId()){
            return null;
        }
        FileCommonVo vo = new FileCommonVo();
        vo.setHandleStatus(file.getHandleStatus());
        vo.setFileId(file.getId());
        vo.setFileViewUrl(getFileUrl(file));
        vo.setDuration(file.getDuration());
        if (StringUtils.isNotEmpty(file.getFileExt()) && file.getFileExt().indexOf("video") >-1){
            vo.setBitrateList(file.parseBitrateList());
            vo.setScreenshotUrl(getScreenshotUrl(file));
        }
        return vo;
    }

}
